From 2f02e9ea125c3ec42afac84ec903767930335dd3 Mon Sep 17 00:00:00 2001 From: Kimdonghan Date: Wed, 3 Dec 2025 18:27:43 +0900 Subject: (김동한) 메뉴명과 화면 내 h태그 일치 작업 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evcp/(evcp)/(master-data)/buyer-signature/page.tsx | 2 +- .../evcp/(evcp)/(master-data)/esg-check-list/page.tsx | 6 +++++- .../(evcp)/(master-data)/evaluation-check-list/page.tsx | 6 +++++- .../(master-data)/evaluation-target-list/page.tsx | 6 +++++- .../(master-data)/general-contract-template/page.tsx | 8 ++++++-- .../evcp/(evcp)/(master-data)/material-groups/page.tsx | 9 ++++++--- app/[lng]/evcp/(evcp)/(master-data)/p-items/page.tsx | 9 ++++++--- .../(evcp)/(master-data)/payment-conditions/page.tsx | 6 +++++- .../evcp/(evcp)/(master-data)/pq-criteria/page.tsx | 6 +++++- .../(evcp)/(master-data)/vendor-check-list/page.tsx | 7 ++++++- .../evcp/(evcp)/(procurement)/avl/avl-page-client.tsx | 7 ++++++- .../evcp/(evcp)/(procurement)/basic-contract/page.tsx | 7 +++++-- .../evcp/(evcp)/(procurement)/bid-failure/page.tsx | 9 +++++++-- .../evcp/(evcp)/(procurement)/bid-receive/page.tsx | 9 +++++++-- .../evcp/(evcp)/(procurement)/bid-selection/page.tsx | 15 +++++++-------- app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx | 4 +++- .../evcp/(evcp)/(procurement)/evaluation-input/page.tsx | 12 ++++++++---- app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx | 6 +++++- app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx | 17 +++++++++++------ app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx | 7 ++++++- app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx | 6 +++++- .../evcp/(evcp)/(procurement)/risk-management/page.tsx | 8 ++++++-- .../(evcp)/(procurement)/vendor-candidates/page.tsx | 6 +++++- .../(evcp)/(procurement)/vendor-investigation/page.tsx | 5 ++++- .../evcp/(evcp)/(procurement)/vendor-pool/page.tsx | 8 +++++++- .../(procurement)/vendor-regular-registrations/page.tsx | 8 +++++--- app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx | 6 +++++- .../(evcp)/(sales)/budgetary-tech-sales-hull/page.tsx | 8 ++++++-- .../(evcp)/(sales)/budgetary-tech-sales-ship/page.tsx | 8 ++++++-- .../(evcp)/(sales)/budgetary-tech-sales-top/page.tsx | 7 +++++-- .../(evcp)/(sales)/tech-contact-possible-items/page.tsx | 9 +++++++-- app/[lng]/evcp/(evcp)/(sales)/tech-project-avl/page.tsx | 4 +++- app/[lng]/evcp/(evcp)/(sales)/tech-vendors/page.tsx | 6 +++++- 33 files changed, 184 insertions(+), 63 deletions(-) (limited to 'app/[lng]') diff --git a/app/[lng]/evcp/(evcp)/(master-data)/buyer-signature/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/buyer-signature/page.tsx index 96bf783c..dfbd605b 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/buyer-signature/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/buyer-signature/page.tsx @@ -15,7 +15,7 @@ export default async function BuyerSignaturePage(props: { params: Promise<{ lng:

{t('menu.master_data.buyer_signature')}

- 계약서에 자동으로 적용될 삼성중공업 서명을 관리합니다. + {t('menu.master_data.buyer_signaturee_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/esg-check-list/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/esg-check-list/page.tsx index a573c77b..4575e65b 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/esg-check-list/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/esg-check-list/page.tsx @@ -9,14 +9,18 @@ import { getEsgEvaluations } from "@/lib/esg-check-list/service" import { getEsgEvaluationsSchema } from "@/lib/esg-check-list/validation" import { EsgEvaluationsTable } from "@/lib/esg-check-list/table/esg-table" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = getEsgEvaluationsSchema.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -35,7 +39,7 @@ export default async function IndexPage(props: IndexPageProps) {

- ESG 자가진단평가서 항목 관리 + {t('menu.master_data.esg_checklist')}

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/evaluation-check-list/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/evaluation-check-list/page.tsx index ccd6766b..5547b097 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/evaluation-check-list/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/evaluation-check-list/page.tsx @@ -9,10 +9,12 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Suspense } from 'react'; import { type SearchParams } from '@/types/table'; import { InformationButton } from '@/components/information/information-button'; +import { useTranslation } from '@/i18n'; // ---------------------------------------------------------------------------------------------------- /* TYPES */ interface EvaluationCriteriaPageProps { + params: Promise<{ lng: string }> searchParams: Promise } @@ -23,6 +25,8 @@ async function EvaluationCriteriaPage(props: EvaluationCriteriaPageProps) { const searchParams = await props.searchParams; const search = searchParamsCache.parse(searchParams); const validFilters = getValidFilters(search.filters); + const { lng } = await props.params + const { t } = await useTranslation(lng, 'menu') const promises = Promise.all([ getRegEvalCriteria({ ...search, @@ -37,7 +41,7 @@ async function EvaluationCriteriaPage(props: EvaluationCriteriaPageProps) {

- 협력업체 평가기준표 관리 + {t('menu.master_data.evaluation_checklist')}

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/evaluation-target-list/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/evaluation-target-list/page.tsx index 325037d8..b42c2037 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/evaluation-target-list/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/evaluation-target-list/page.tsx @@ -9,6 +9,7 @@ import { getDefaultEvaluationYear, searchParamsEvaluationTargetsCache } from "@/ import { getEvaluationTargets } from "@/lib/evaluation-target-list/service" import { InformationButton } from "@/components/information/information-button" import { EvaluationTargetsTable } from "@/lib/evaluation-target-list/table/evaluation-target-table" +import { useTranslation } from "@/i18n" export const dynamic = 'force-dynamic' export const revalidate = 0 @@ -19,11 +20,14 @@ export const metadata: Metadata = { } interface EvaluationTargetsPageProps { + params: Promise<{ lng: string }> searchParams: Promise } export default async function EvaluationTargetsPage(props: EvaluationTargetsPageProps) { const searchParams = await props.searchParams + const { lng } = await props.params + const { t } = await useTranslation(lng, 'menu') // ✅ 간소화된 파싱 const search = searchParamsEvaluationTargetsCache.parse(searchParams) @@ -42,7 +46,7 @@ export default async function EvaluationTargetsPage(props: EvaluationTargetsPage

- 협력업체 평가 대상 관리 + {t('menu.master_data.evaluation_target')}

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/general-contract-template/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/general-contract-template/page.tsx index 8a652690..c82f6b5a 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/general-contract-template/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/general-contract-template/page.tsx @@ -9,14 +9,18 @@ import { getContractTemplates } from "@/lib/general-contract-template/service" import { searchParamsTemplatesCache } from "@/lib/general-contract-template/validations" import { ContractTemplateTable } from "@/lib/general-contract-template/template/general-contract-template" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsTemplatesCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -34,12 +38,12 @@ export default async function IndexPage(props: IndexPageProps) {

- 일반계약(Contract) 표준양식 관리 + {t('menu.master_data.general_contract_template')}

- 다양한 계약 유형의 표준양식을 관리합니다. LO, FA, PO, CS, EU 등 계약 종류별 템플릿을 등록하고 편집할 수 있습니다. + {t('menu.master_data.general_contract_template_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/material-groups/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/material-groups/page.tsx index 3d019182..708fac1e 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/material-groups/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/material-groups/page.tsx @@ -15,14 +15,17 @@ import { MaterialGroupTable } from "@/lib/material-groups/table/material-group-t import { InformationButton } from "@/components/information/information-button" import { MaterialGroupSyncButton } from "@/components/material-groups/sync-button" import { searchParamsCache } from "@/lib/material-groups/validations" +import { useTranslation } from "@/i18n" interface MaterialGroupPageProps { + params: Promise<{ lng: string }> searchParams: Promise } export default async function MaterialGroupPage(props: MaterialGroupPageProps) { const searchParams = await props.searchParams - + const { lng } = await props.params + const { t } = await useTranslation(lng, 'menu') // searchParamsCache를 사용해서 파라미터 파싱 const search = searchParamsCache.parse(searchParams) @@ -43,12 +46,12 @@ export default async function MaterialGroupPage(props: MaterialGroupPageProps) {

- 자재그룹 + {t('menu.master_data.material_master')}

- MDG로부터 수신된 자재그룹 정보 + {t('menu.master_data.material_master_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/p-items/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/p-items/page.tsx index 2b907a75..fa0cef19 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/p-items/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/p-items/page.tsx @@ -8,14 +8,17 @@ import { getProcurementItems } from "@/lib/procurement-items/service" import { ProcurementItemsTable } from "@/lib/procurement-items/table/procurement-items-table" import { searchParamsCache } from "@/lib/procurement-items/validations" import { InformationButton } from "@/components/information/information-button" - +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -33,12 +36,12 @@ export default async function IndexPage(props: IndexPageProps) {

- 1회성 품목 관리 + {t('menu.master_data.procurement_items')}

- 입찰에서 사용하는 1회성 품목을 등록하고 관리합니다. + {t('menu.master_data.procurement_items_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/payment-conditions/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/payment-conditions/page.tsx index 49724328..ff6d24b2 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/payment-conditions/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/payment-conditions/page.tsx @@ -8,7 +8,9 @@ import { SearchParamsCache } from "@/lib/payment-terms/validations"; import { getPaymentTerms } from "@/lib/payment-terms/service"; import { PaymentTermsTable } from "@/lib/payment-terms/table/payment-terms-table"; import { InformationButton } from "@/components/information/information-button"; +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{ lng: string }> searchParams: Promise; } @@ -16,6 +18,8 @@ export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams; const search = SearchParamsCache.parse(searchParams); const validFilters = getValidFilters(search.filters); + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const promises = Promise.all([ getPaymentTerms({ @@ -29,7 +33,7 @@ export default async function IndexPage(props: IndexPageProps) {
-

지급 조건 관리

+

{t('menu.master_data.payment_conditions')}

{/*

diff --git a/app/[lng]/evcp/(evcp)/(master-data)/pq-criteria/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/pq-criteria/page.tsx index 1a337cc9..e83696ce 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/pq-criteria/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/pq-criteria/page.tsx @@ -7,14 +7,18 @@ import { searchParamsCache } from "@/lib/pq/validations" import { getPQLists } from "@/lib/pq/service" import { PqListsTable } from "@/lib/pq/table/pq-lists-table" import { getProjects } from "@/lib/pq/service" +import { useTranslation } from "@/i18n" interface ProjectPageProps { + params: Promise<{ lng: string }> searchParams: Promise } export default async function ProjectPage(props: ProjectPageProps) { const searchParams = await props.searchParams const search = searchParamsCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') // filters가 없는 경우를 처리 const validFilters = getValidFilters(search.filters) @@ -33,7 +37,7 @@ export default async function ProjectPage(props: ProjectPageProps) {

- PQ 리스트 관리 + {t('menu.master_data.pq_criteria')}

{/*

협력업체 등록을 위한, 협력업체가 제출할 PQ 항목을: 프로젝트별로 관리할 수 있습니다. diff --git a/app/[lng]/evcp/(evcp)/(master-data)/vendor-check-list/page.tsx b/app/[lng]/evcp/(evcp)/(master-data)/vendor-check-list/page.tsx index 955c95f0..4cc5a9a0 100644 --- a/app/[lng]/evcp/(evcp)/(master-data)/vendor-check-list/page.tsx +++ b/app/[lng]/evcp/(evcp)/(master-data)/vendor-check-list/page.tsx @@ -9,14 +9,19 @@ import { getGenralEvaluationsSchema } from "@/lib/general-check-list/validation" import { GeneralEvaluationsTable } from "@/lib/general-check-list/table/general-check-list-table" import { getGeneralEvaluations } from "@/lib/general-check-list/service" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" + interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = getGenralEvaluationsSchema.parse(searchParams) + const { lng } = await props.params + const { t } = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -35,7 +40,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 협력업체 평가자료 문항 관리 + {t('menu.master_data.vendor_checklist')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx b/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx index 7152bdc2..cb191dd4 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx @@ -7,6 +7,8 @@ import { getAvlLists } from "@/lib/avl/service" import { AvlListItem } from "@/lib/avl/types" import { toast } from "sonner" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n/client" +import { useParams } from "next/navigation" interface AvlPageClientProps { initialData: AvlListItem[] @@ -17,6 +19,9 @@ export function AvlPageClient({ initialData }: AvlPageClientProps) { const [isLoading, setIsLoading] = useState(false) const [registrationMode, setRegistrationMode] = useState<'standard' | 'project' | null>(null) + const params = useParams<{lng: string}>() + const lng = params?.lng ?? 'ko' + const {t} = useTranslation(lng, 'menu') // 초기 데이터 설정 useEffect(() => { setAvlListData(initialData) @@ -73,7 +78,7 @@ export function AvlPageClient({ initialData }: AvlPageClientProps) { {/* info button and header section */}

- AVL(Approved Vendor List) 목록 + {t('menu.vendor_management.avl_management')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx index 66b3ee31..57fceadf 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx @@ -9,15 +9,18 @@ import { getBasicContracts } from "@/lib/basic-contract/service" import { searchParamsCache } from "@/lib/basic-contract/validations" import { BasicContractsTable } from "@/lib/basic-contract/status/basic-contract-table" import { InformationButton } from "@/components/information/information-button" - +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -36,7 +39,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 기본계약서/서약서 관리 + {t('menu.vendor_management.basic_contract')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx index b6c181dc..254fdc13 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx @@ -2,6 +2,7 @@ import { Metadata } from 'next' import { getBiddingsForFailure } from '@/lib/bidding/service' import { GetBiddingsSchema, searchParamsCache } from '@/lib/bidding/validation' import { BiddingsFailureTable } from '@/lib/bidding/failure/biddings-failure-table' +import { useTranslation } from "@/i18n" export const metadata: Metadata = { title: '폐찰 및 재입찰', @@ -9,15 +10,19 @@ export const metadata: Metadata = { } interface BiddingFailurePageProps { + params: Promise<{lng: string}> searchParams: Promise> } export default async function BiddingFailurePage({ + params, searchParams, }: BiddingFailurePageProps) { // URL 파라미터 검증 const searchParamsResolved = await searchParams const search = searchParamsCache.parse(searchParamsResolved) + const {lng} = await params + const {t} = await useTranslation(lng, 'menu') // 데이터 조회 const biddingsPromise = getBiddingsForFailure(search) @@ -26,9 +31,9 @@ export default async function BiddingFailurePage({
-

폐찰 및 재입찰

+

{t('menu.procurement.bid_failure')}

- 유찰된 입찰 내역을 확인하고 재입찰을 진행할 수 있습니다. + {t('menu.procurement.bid_failure_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx index 4f6e9715..a087b09f 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx @@ -2,6 +2,7 @@ import { Metadata } from 'next' import { getBiddingsForReceive } from '@/lib/bidding/service' import { GetBiddingsSchema, searchParamsCache } from '@/lib/bidding/validation' import { BiddingsReceiveTable } from '@/lib/bidding/receive/biddings-receive-table' +import { useTranslation } from "@/i18n" export const metadata: Metadata = { title: '입찰서 접수 및 마감', @@ -9,15 +10,19 @@ export const metadata: Metadata = { } interface BiddingReceivePageProps { + params: Promise<{lng: string}> searchParams: Promise> } export default async function BiddingReceivePage({ + params, searchParams, }: BiddingReceivePageProps) { // URL 파라미터 검증 const searchParamsResolved = await searchParams const search = searchParamsCache.parse(searchParamsResolved) + const {lng} = await params + const {t} = await useTranslation(lng, 'menu') // 데이터 조회 const biddingsPromise = getBiddingsForReceive(search) @@ -26,9 +31,9 @@ export default async function BiddingReceivePage({
-

입찰서 접수 및 마감

+

{t('menu.procurement.bid_receive')}

- 입찰서 접수 현황을 확인하고 개찰을 진행할 수 있습니다. + {t('menu.procurement.bid_receive_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx index 40b714de..f2fa33cd 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx @@ -1,23 +1,22 @@ -import { Metadata } from 'next' import { getBiddingsForSelection } from '@/lib/bidding/service' import { GetBiddingsSchema, searchParamsCache } from '@/lib/bidding/validation' import { BiddingsSelectionTable } from '@/lib/bidding/selection/biddings-selection-table' - -export const metadata: Metadata = { - title: '입찰선정', - description: '개찰 이후 입찰가를 확인하고 낙찰업체를 선정할 수 있습니다.', -} +import { useTranslation } from "@/i18n" interface BiddingSelectionPageProps { + params: Promise<{lng: string}> searchParams: Promise> } export default async function BiddingSelectionPage({ + params, searchParams, }: BiddingSelectionPageProps) { // URL 파라미터 검증 const searchParamsResolved = await searchParams const search = searchParamsCache.parse(searchParamsResolved) + const {lng} = await params + const {t} = await useTranslation(lng, 'menu') // 데이터 조회 const biddingsPromise = getBiddingsForSelection(search) @@ -26,9 +25,9 @@ export default async function BiddingSelectionPage({
-

입찰선정

+

{t('menu.procurement.bid_selection')}

- 개찰 이후 입찰가를 확인하고 낙찰업체를 선정할 수 있습니다. + {t('menu.procurement.bid_selection_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx index 973593d8..55dbae32 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx @@ -17,6 +17,7 @@ export const metadata = { } interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } @@ -24,6 +25,7 @@ export default async function BiddingsPage(props: IndexPageProps) { // ✅ nuqs searchParamsCache로 파싱 (타입 안전성 보장) const searchParams = await props.searchParams const search = searchParamsCache.parse(searchParams) + const {lng} = await props.params const validFilters = getValidFilters(search.filters) @@ -42,7 +44,7 @@ export default async function BiddingsPage(props: IndexPageProps) { {/* ═══════════════════════════════════════════════════════════════ */} {/* 페이지 헤더 */} {/* ═══════════════════════════════════════════════════════════════ */} - + {/* ═══════════════════════════════════════════════════════════════ */} {/* 메인 테이블 */} diff --git a/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx index 51478cc0..635169ce 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx @@ -12,8 +12,10 @@ import { LogIn } from "lucide-react" import { getSHIEvaluationSubmissions } from "@/lib/evaluation-submit/service" import { getSHIEvaluationsSubmitSchema } from "@/lib/evaluation-submit/validation" import { SHIEvaluationSubmissionsTable } from "@/lib/evaluation-submit/table/submit-table" +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } @@ -21,7 +23,9 @@ export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = getSHIEvaluationsSubmitSchema.parse(searchParams) const validFilters = getValidFilters(search.filters) - + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') + // Get session const session = await getServerSession(authOptions) @@ -34,7 +38,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 협력업체 정기평가 입력 + {t('menu.vendor_management.evaluation_input')}

{/*

@@ -74,7 +78,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 협력업체 정기평가 입력 + {t('menu.vendor_management.evaluation_input')}

@@ -104,7 +108,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 협력업체 정기평가 입력 + {t('menu.vendor_management.evaluation_input')}

{/*

요청된 정기평가를 입력하고 제출할 수 있습니다. diff --git a/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx index 0d3848d9..bf30cfc9 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx @@ -24,6 +24,7 @@ import { type GetEvaluationsSchema } from "@/lib/evaluation/validation" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" export const metadata: Metadata = { title: "협력업체 정기평가", @@ -31,6 +32,7 @@ export const metadata: Metadata = { } interface PeriodicEvaluationsPageProps { + params: Promise<{lng: string}> searchParams: Promise } @@ -133,6 +135,8 @@ function AggregatedModeNotice({ isAggregated }: { isAggregated: boolean }) { export default async function PeriodicEvaluationsPage(props: PeriodicEvaluationsPageProps) { const searchParams = await props.searchParams + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') // ✅ nuqs 기반 파라미터 파싱 const search = searchParamsEvaluationsCache.parse(searchParams) @@ -156,7 +160,7 @@ export default async function PeriodicEvaluationsPage(props: PeriodicEvaluations

- 협력업체 정기평가 + {t('menu.vendor_management.evaluation')}

{/* */} diff --git a/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx index 292ef1cb..59b793ab 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx @@ -1,4 +1,4 @@ -import * as React from "react" + import { type SearchParams } from "@/types/table" import { getValidFilters } from "@/lib/data-table" @@ -9,14 +9,19 @@ import { getVendorPOs } from "@/lib/po/vendor-table/service" import { vendorPoSearchParamsCache } from "@/lib/po/vendor-table/validations" import { ShiVendorPoTable } from "@/lib/po/vendor-table/shi-vendor-po-table" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" +import { Suspense } from "react" interface VendorPOPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function VendorPONew(props: VendorPOPageProps) { const searchParams = await props.searchParams const search = vendorPoSearchParamsCache.parse(searchParams) + const { lng } = await props.params + const { t } = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -34,7 +39,7 @@ export default async function VendorPONew(props: VendorPOPageProps) {

- PO/계약 관리 + {t('menu.procurement.po_issuance')}

@@ -42,9 +47,9 @@ export default async function VendorPONew(props: VendorPOPageProps) {
- }> - - }> + + - + ) } diff --git a/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx index 6a992ee5..e1fcd80d 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx @@ -8,12 +8,15 @@ import { searchParamsPQReviewCache } from "@/lib/pq/validations" import { getPQSubmissions } from "@/lib/pq/service" import { PQSubmissionsTable } from "@/lib/pq/pq-review-table-new/vendors-table" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" + export const metadata: Metadata = { title: "협력업체 PQ/실사 현황", description: "", } interface PQReviewPageProps { + params: Promise<{lng: string}> searchParams: Promise } @@ -21,6 +24,8 @@ export default async function PQReviewPage(props: PQReviewPageProps) { const searchParams = await props.searchParams const search = searchParamsPQReviewCache.parse(searchParams) const validFilters = getValidFilters(search.filters) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') // 디버깅 로그 추가 console.log("=== PQ Page Debug ==="); @@ -71,7 +76,7 @@ export default async function PQReviewPage(props: PQReviewPageProps) {

- 협력업체 PQ/실사 현황 + {t('menu.vendor_management.pq_status')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx index 6830dbe9..223046b7 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx @@ -23,6 +23,7 @@ import { RfqTable } from "@/lib/rfq-last/table/rfq-table"; import { getRfqs } from "@/lib/rfq-last/service"; import { searchParamsRfqCache } from "@/lib/rfq-last/validations"; import { InformationButton } from "@/components/information/information-button"; +import { useTranslation } from "@/i18n" export const metadata: Metadata = { title: "RFQ 관리", @@ -30,6 +31,7 @@ export const metadata: Metadata = { }; interface RfqPageProps { + params: Promise<{lng: string}> searchParams: Promise; } @@ -63,6 +65,8 @@ async function getTabCounts() { export default async function RfqPage(props: RfqPageProps) { const searchParams = await props.searchParams; + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') // nuqs 기반 파라미터 파싱 const search = searchParamsRfqCache.parse(searchParams); @@ -89,7 +93,7 @@ export default async function RfqPage(props: RfqPageProps) {

- 견적목록관리 + {t('menu.procurement.budget_rfq')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx index c372865e..d2334ba5 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx @@ -13,11 +13,13 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Suspense } from 'react'; import { type DateRange } from 'react-day-picker'; import { type SearchParams } from '@/types/table'; +import { useTranslation } from "@/i18n" // ---------------------------------------------------------------------------------------------------- /* TYPES */ interface RiskManagementPageProps { + params: Promise<{lng: string}> searchParams: Promise; } @@ -29,6 +31,8 @@ async function RiskManagementPage(props: RiskManagementPageProps) { const searchParamsResult = await searchParams; const search = searchParamsCache.parse(searchParamsResult); const validFilters = getValidFilters(search.filters); + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const promises = Promise.all([ getRisksView({ ...search, @@ -52,12 +56,12 @@ async function RiskManagementPage(props: RiskManagementPageProps) {

- 협력업체 리스크 관리 + {t('menu.vendor_management.risk_by_agency')}

- 신용평가사 정보를 기반으로 국내 협력업체 리스크를 관리할 수 있습니다. + {t('menu.vendor_management.risk_by_agency_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx index be6debce..04df8e6b 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx @@ -11,13 +11,17 @@ import { searchParamsCandidateCache } from "@/lib/vendor-candidates/validations" import { VendorCandidateTable } from "@/lib/vendor-candidates/table/candidates-table" import { DateRangePicker } from "@/components/date-range-picker" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsCandidateCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -37,7 +41,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 발굴업체 등록 관리 + {t('menu.vendor_management.candidates')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx index 1d7786a5..e7109dcb 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx @@ -10,6 +10,7 @@ import { VendorsInvestigationTable } from "@/lib/vendor-investigation/table/inve import { getVendorsInvestigation } from "@/lib/vendor-investigation/service" import { searchParamsInvestigationCache } from "@/lib/vendor-investigation/validations" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface IndexPageProps { searchParams: Promise } @@ -17,6 +18,8 @@ interface IndexPageProps { export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsInvestigationCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -35,7 +38,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 협력업체 실사 관리 + {t('menu.vendor_management.investigation')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx index f18716a3..362974df 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx @@ -7,10 +7,16 @@ import { VendorPoolVirtualTable } from "@/lib/vendor-pool/table/vendor-pool-virt import { Skeleton } from "@/components/ui/skeleton" import type { VendorPoolItem } from "@/lib/vendor-pool/table/vendor-pool-table-columns" import { toast } from "sonner" +import { useTranslation } from "@/i18n/client" +import { useParams } from "next/navigation" + export default function VendorPoolPage() { const [data, setData] = React.useState([]) const [isLoading, setIsLoading] = React.useState(true) + const params = useParams<{lng: string}>() + const lng = params?.lng ?? 'ko' + const {t} = useTranslation(lng, 'menu') // 전체 데이터 로드 const loadData = React.useCallback(async () => { @@ -52,7 +58,7 @@ export default function VendorPoolPage() {

- Vendor Pool + {t('menu.vendor_management.vendor_pool')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx index e8433c55..4915edcd 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx @@ -10,13 +10,15 @@ import { Shell } from "@/components/shell" import { fetchVendorRegularRegistrations } from "@/lib/vendor-regular-registrations/service" import { VendorRegularRegistrationsTable } from "@/lib/vendor-regular-registrations/table/vendor-regular-registrations-table" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" - -export default async function VendorRegularRegistrationsPage() { +export default async function VendorRegularRegistrationsPage(props: {params: Promise<{lng: string}>}) { const promises = Promise.all([ fetchVendorRegularRegistrations(), ]) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') return ( @@ -25,7 +27,7 @@ export default async function VendorRegularRegistrationsPage() {

- 정규업체 등록관리 + {t('menu.vendor_management.vendor_regular_registrations')}

diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx index fb7bb14c..4a071ee0 100644 --- a/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx +++ b/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx @@ -12,13 +12,17 @@ import { getVendors, getVendorStatusCounts } from "@/lib/vendors/service" import { VendorsTable } from "@/lib/vendors/table/vendors-table" import { Ellipsis } from "lucide-react" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -38,7 +42,7 @@ export default async function IndexPage(props: IndexPageProps) {

- 협력업체 관리 + {t('menu.vendor_management.vendors')}

diff --git a/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-hull/page.tsx b/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-hull/page.tsx index 97e53567..2ca48091 100644 --- a/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-hull/page.tsx +++ b/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-hull/page.tsx @@ -7,14 +7,18 @@ import { RFQListTable } from "@/lib/techsales-rfq/table/rfq-table" import { type SearchParams } from "@/types/table" import * as React from "react" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface HullRfqPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function HullRfqPage(props: HullRfqPageProps) { // searchParams를 await하여 resolve const searchParams = await props.searchParams - + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') + // 해양 HULL용 파라미터 파싱 const search = searchParamsHullCache.parse(searchParams); const validFilters = getValidFilters(search.filters); @@ -35,7 +39,7 @@ export default async function HullRfqPage(props: HullRfqPageProps) {

- 기술영업-해양 Hull Budgetary RFQ + {t('menu.tech_sales.budgetary_hull')}

diff --git a/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-ship/page.tsx b/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-ship/page.tsx index 779b9ac9..0791a9bd 100644 --- a/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-ship/page.tsx +++ b/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-ship/page.tsx @@ -7,14 +7,18 @@ import { RFQListTable } from "@/lib/techsales-rfq/table/rfq-table" import { type SearchParams } from "@/types/table" import * as React from "react" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface RfqPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function RfqPage(props: RfqPageProps) { // searchParams를 await하여 resolve const searchParams = await props.searchParams - + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') + // 조선용 파라미터 파싱 const search = searchParamsShipCache.parse(searchParams); const validFilters = getValidFilters(search.filters); @@ -35,7 +39,7 @@ export default async function RfqPage(props: RfqPageProps) {

- 기술영업-조선 Budgetary RFQ + {t('menu.tech_sales.budgetary_ship')}

diff --git a/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-top/page.tsx b/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-top/page.tsx index 5c96c85d..0949d9a0 100644 --- a/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-top/page.tsx +++ b/app/[lng]/evcp/(evcp)/(sales)/budgetary-tech-sales-top/page.tsx @@ -7,14 +7,17 @@ import { RFQListTable } from "@/lib/techsales-rfq/table/rfq-table" import { type SearchParams } from "@/types/table" import * as React from "react" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface HullRfqPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function HullRfqPage(props: HullRfqPageProps) { // searchParams를 await하여 resolve const searchParams = await props.searchParams - + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') // 해양 TOP용 파라미터 파싱 const search = searchParamsTopCache.parse(searchParams); const validFilters = getValidFilters(search.filters); @@ -35,7 +38,7 @@ export default async function HullRfqPage(props: HullRfqPageProps) {

- 기술영업-해양 TOP Budgetary RFQ + {t('menu.tech_sales.budgetary_top')}

diff --git a/app/[lng]/evcp/(evcp)/(sales)/tech-contact-possible-items/page.tsx b/app/[lng]/evcp/(evcp)/(sales)/tech-contact-possible-items/page.tsx index cf35530d..ad7c7b36 100644 --- a/app/[lng]/evcp/(evcp)/(sales)/tech-contact-possible-items/page.tsx +++ b/app/[lng]/evcp/(evcp)/(sales)/tech-contact-possible-items/page.tsx @@ -6,17 +6,22 @@ import { searchParamsCache } from "@/lib/contact-possible-items/validations" import { ContactPossibleItemsTable } from "@/lib/contact-possible-items/table/contact-possible-items-table" import { getValidFilters } from "@/lib/data-table" import { type SearchParams } from "@/types/table" +import { useTranslation } from "@/i18n" interface ContactPossibleItemsPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function ContactPossibleItemsPage({ + params, searchParams, }: ContactPossibleItemsPageProps) { // ✅ searchParams 파싱 const resolvedSearchParams = await searchParams const search = searchParamsCache.parse(resolvedSearchParams) + const {lng} = await params + const {t} = await useTranslation(lng, 'menu') console.log("Parsed search params:", search) @@ -39,10 +44,10 @@ export default async function ContactPossibleItemsPage({

- 담당자별 자재 관리 + {t('menu.tech_sales.contact_items')}

- 기술영업 담당자별 자재를 관리합니다. + {t('menu.tech_sales.contact_items_desc')}

diff --git a/app/[lng]/evcp/(evcp)/(sales)/tech-project-avl/page.tsx b/app/[lng]/evcp/(evcp)/(sales)/tech-project-avl/page.tsx index 4ce018cd..c9ec6075 100644 --- a/app/[lng]/evcp/(evcp)/(sales)/tech-project-avl/page.tsx +++ b/app/[lng]/evcp/(evcp)/(sales)/tech-project-avl/page.tsx @@ -12,6 +12,7 @@ import { getValidFilters } from "@/lib/data-table" import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton" import { Ellipsis } from "lucide-react" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" export interface PageProps { params: Promise<{ lng: string }> searchParams: Promise @@ -22,6 +23,7 @@ export default async function AcceptedQuotationsPage({ searchParams, }: PageProps) { const { lng } = await params + const {t} = await useTranslation(lng, 'menu') const session = await getServerSession(authOptions) if (!session) { @@ -47,7 +49,7 @@ export default async function AcceptedQuotationsPage({

- 견적 Result 전송 + {t('menu.tech_sales.result_transmission')}

diff --git a/app/[lng]/evcp/(evcp)/(sales)/tech-vendors/page.tsx b/app/[lng]/evcp/(evcp)/(sales)/tech-vendors/page.tsx index 736a7bad..7475c274 100644 --- a/app/[lng]/evcp/(evcp)/(sales)/tech-vendors/page.tsx +++ b/app/[lng]/evcp/(evcp)/(sales)/tech-vendors/page.tsx @@ -8,14 +8,18 @@ import { Shell } from "@/components/shell" import { searchParamsCache } from "@/lib/tech-vendors/validations" import { getTechVendors, getTechVendorStatusCounts } from "@/lib/tech-vendors/service" import { TechVendorsTable } from "@/lib/tech-vendors/table/tech-vendors-table" +import { useTranslation } from "@/i18n" interface IndexPageProps { + params: Promise<{lng: string}> searchParams: Promise } export default async function IndexPage(props: IndexPageProps) { const searchParams = await props.searchParams const search = searchParamsCache.parse(searchParams) + const {lng} = await props.params + const {t} = await useTranslation(lng, 'menu') const validFilters = getValidFilters(search.filters) @@ -33,7 +37,7 @@ export default async function IndexPage(props: IndexPageProps) { {/* 왼쪽: 타이틀 & 설명 */}
-

기술영업 협력업체 관리

+

{t('menu.tech_sales.vendors')}

{/* InformationButton은 필요시 추가 */} {/* */}
-- cgit v1.2.3